import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;


public class Ejercicio3 {
	
	
	
	static void leerArchivo() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(new File("Tp2Ej3.in")));
		BufferedWriter bw = new BufferedWriter(new FileWriter(new File("Tp2Ej3.out")));
		
		ArrayList<ArrayList<Integer>> matrizVecinos = new ArrayList<ArrayList<Integer>>();
		int cantNodos = 0;
		int counter = 1;
		String [] linea = br.readLine().trim().split("\\s+");
		while(Integer.parseInt(linea[0]) != -1) {
			cantNodos = Integer.parseInt(linea[0]);
		
			for (int i = 0; i < cantNodos; i++) {
				ArrayList<Integer> vecinos = new ArrayList<Integer>();
				linea = br.readLine().trim().split("\\s+");
				int cantVecinos = new Integer(linea[0]);
				for (int j = 1; j < cantVecinos+1; j++) {
					vecinos.add(Integer.parseInt(linea[j]));
				}
				matrizVecinos.add(vecinos);
			}
			
			long timeNanoInicio = System.nanoTime();
			//--Comienza algoritmo--
			int [][] matrizAdyacencia = getMatrizAdyacencia(matrizVecinos,cantNodos);
			int [][] matrizAdyacenciaComplemento= getComplemento(matrizAdyacencia,cantNodos);
			ArrayList<ArrayList<Integer>> matrizVecinosComplemento = getMatrizVecinos(matrizAdyacenciaComplemento);
			bw.append(davidYJacobo(matrizVecinos,matrizAdyacencia )+" "+davidYJacobo(matrizVecinosComplemento, matrizAdyacenciaComplemento));
			
			//--Termina algoritmo--
			long timeNanoFinal = System.nanoTime();
			//bwTime.append(Math.pow(cantNodos, 3)+",");
			bw.newLine();
			matrizVecinos.clear();
			
			linea = br.readLine().trim().split("\\s+");
		}
		br.close();
		bw.close();
		
	}
	
	

	public static ArrayList<ArrayList<Integer>> getMatrizVecinos(int[][] matrizAdyacenciaComplemento) {
		ArrayList<ArrayList<Integer>> matrizVecinos = new ArrayList<ArrayList<Integer>>();
		for (int i = 0; i < matrizAdyacenciaComplemento.length; i++) {
			ArrayList<Integer> vecinos = new ArrayList<Integer>();
			for (int j = 0; j < matrizAdyacenciaComplemento.length; j++) {
				if(matrizAdyacenciaComplemento[i][j]==1){
					vecinos.add(j+1);
				}
			}
			matrizVecinos.add(vecinos);
		}
		return matrizVecinos;
	}



	private static int[][] getComplemento(int[][] matrizAdyacencia, int cantNodos) {
		int [][] complemento = new int [cantNodos][cantNodos];
		for (int i = 0; i < complemento.length; i++) {
			for (int j = 0; j < complemento.length; j++) {
				if(matrizAdyacencia[i][j]==0 && i!=j){
					complemento[i][j]=1;
				}else{
					complemento[i][j]=0;
				}
			}
		}
		return complemento;
	}



	public static String davidYJacobo(ArrayList<ArrayList<Integer>> matrizVecinos, int [][] matrizAdyacencia){
		
		int [][] matrizCompletada = completarMatriz(matrizAdyacencia, matrizAdyacencia.length);
		matrizCompletada = multMatrices(matrizCompletada, new Strassen1MatrixMultiplication());
		
		
		Integer minNodoDavidYJacobo = getMinNodoParaTriangulo(matrizCompletada);
		int[] amigosDavidYJacobo = new int[3];
			if (minNodoDavidYJacobo==null) {
			return "0 0 0";
		}
		ArrayList<Integer> vecinosDeDavid = matrizVecinos.get(minNodoDavidYJacobo);
		
		for (Integer i : vecinosDeDavid) {
		
			ArrayList<Integer> vecinosDeVecinosDeDavid = matrizVecinos.get(i-1);
			for (Integer j : vecinosDeVecinosDeDavid) {
		
				if(matrizAdyacencia[minNodoDavidYJacobo][j-1]==1){
					amigosDavidYJacobo[0] = minNodoDavidYJacobo + 1;
					if (i < j){
						ordenarAmigosDavid(amigosDavidYJacobo, i, j);
					}
					else{
						ordenarAmigosDavid(amigosDavidYJacobo, j , i);
					}
				}
			}
			
		}
		
		return amigosDavidYJacobo[0] + " " + amigosDavidYJacobo[1] + " " + amigosDavidYJacobo[2] ;
	}
	
	

	private static void ordenarAmigosDavid(int[] amigosDavid, int i, int j) {
		if(amigosDavid[1]==0){
			amigosDavid[1]=i;
			amigosDavid[2]=j;
		}
		
		if (i < amigosDavid[1]) {
				amigosDavid[1] = i;
				amigosDavid[2] = j;
		} else {
				if (i == amigosDavid[1]) {
					if (j < amigosDavid[2]) {
						amigosDavid[2] = j;
					}
				}
			}
		}

	public static void main(String[] args) {
		
		try {
			leerArchivo();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	
	public static int getPotDe2MasCercana(int n){
		return (int)Math.ceil((Math.log10(n)/Math.log10(2)));	
	}
	
	public static int[][] completarMatriz(int[][] matriz,int k){
		
		int n = Ejercicio3.getPotDe2MasCercana(k);
		n = (int)Math.pow(2, n); 
		
		int[][] nueva = new int[n][n];
		for (int i = 0; i < matriz.length; i++) {
		
			for (int j = 0; j < matriz.length; j++) {
		
				nueva[i][j] = matriz[i][j];
			}
		}
		return nueva;
	}
	
	private static int[][] multMatrices(int[][]a,IntMatrixMultiplication metodo){
		int [][] c = new int[a.length][a.length];
		int [][] d = new int[a.length][a.length];
		
		c = metodo.mult(c, a, a);
		d = metodo.mult(d, c, a);
		
		return d;
	}
	
	public static Integer getMinNodoParaTriangulo(int[][]c){
		int posDiagonal = 0;
		
		while(posDiagonal < c.length){
		
			if(c[posDiagonal][posDiagonal]>0){
				return new Integer(posDiagonal);
			}
			posDiagonal++;
		}
		
		return null;
	}
	
	private static int[][] getMatrizAdyacencia(ArrayList<ArrayList<Integer>> matrizVecinos, int cantNodos) {
		int [][] matrizAdyacencia = new int[cantNodos][cantNodos];
		for (int i = 0; i < matrizVecinos.size(); i++) {
			for (Integer j : matrizVecinos.get(i)) {
				matrizAdyacencia[i][j-1] = 1;
			}
		}
		return matrizAdyacencia;
	}
	

}
